package com.gxt.riaapp.client;

import java.util.Date;

import com.extjs.gxt.ui.client.Registry;
import com.extjs.gxt.ui.client.core.XDOM;
import com.extjs.gxt.ui.client.event.Listener;
import com.extjs.gxt.ui.client.event.MessageBoxEvent;
import com.extjs.gxt.ui.client.mvc.AppEvent;
import com.extjs.gxt.ui.client.mvc.Dispatcher;
import com.extjs.gxt.ui.client.widget.Info;
import com.extjs.gxt.ui.client.widget.MessageBox;
import com.extjs.gxt.ui.client.widget.ProgressBar;
import com.extjs.gxt.ui.client.widget.button.Button;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.core.client.GWT;
import com.google.gwt.user.client.Timer;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.gxt.riaapp.client.mvc.AppController;
import com.gxt.riaapp.client.mvc.ContentController;
import com.gxt.riaapp.client.mvc.NavigationController;
import com.gxt.riaapp.client.mvc.RiaAppModel;
import com.gxt.riaapp.client.mvc.model.Entry;
import com.gxt.riaapp.client.resource.icon.ResourceIcons;

import pl.rmalinowski.gwtreflect.client.reflect.Class;
import pl.rmalinowski.gwtreflect.client.reflect.ClassNotFoundException;
import pl.rmalinowski.gwtreflect.client.reflect.IllegalAccessException;
import pl.rmalinowski.gwtreflect.client.reflect.IllegalArgumentException;
import pl.rmalinowski.gwtreflect.client.reflect.InstantiationException;
import pl.rmalinowski.gwtreflect.client.reflect.InvocationTargetException;
import pl.rmalinowski.gwtreflect.client.reflect.Method;
import pl.rmalinowski.gwtreflect.client.reflect.NoSuchMethodException;

/**
 * Entry point classes define <code>onModuleLoad()</code>.
 */
public class RiaApp implements EntryPoint {	
	
	RiaAppPgmServiceAsync service = (RiaAppPgmServiceAsync) GWT.create(RiaAppPgmService.class);
	
	
	public static final ResourceIcons ICONS = GWT.create(ResourceIcons.class);
	
	private Dispatcher dispatcher;
	public static final String MODEL = "RiaAppModel";
	private RiaAppModel model;
	public void onModuleLoad() {
		model = new RiaAppModel();
	    Registry.register(MODEL, model);  // 최초 실행시 Registry에 RiaAppModel을 등록한다.
		dispatcher = Dispatcher.get();
	    dispatcher.addController(new AppController());
	    dispatcher.addController(new NavigationController());  // 좌측
	    dispatcher.addController(new ContentController());
	    dispatcher.dispatch(AppEvents.Init);
	    
	    if(model.getEntries().size()>0) // 등록된 첫번째 프로그램을 보여준다.
			showPage(model.getEntries().get(0));

	    onSubmit(); // 서버쪽 메소드를 호출해서 세션이 유효한지 확인한다.
	   
	}
	/**
	 * Native Javascript Call
	 */
	private native void goIndex() /*-{ 
		$wnd.location.href = "/index.html"; 
	}-*/;
	
	private native void continueSession() /*-{ 
		$wnd.checkLogin(); 
	}-*/;
	
	/**
	 * 세션이 유효하지 않을 경우 뛰워주는 경고창 내의 OK버튼을 감시할 리스너
	 */
	final Listener<MessageBoxEvent> btnListener = new Listener<MessageBoxEvent>() {  
		public void handleEvent(MessageBoxEvent ce) {  
			goIndex();
		}  
	};  
	public void roop(){
		String stime = new Date().toString();
		final MessageBox box = MessageBox.progress("세션 시간 측정 중...", "시작시간은 : "+stime,  
		"Initializing...");  
		 final ProgressBar bar = box.getProgressBar();  
		 final Timer t = new Timer() {  
			 float i;  
			 @Override  
			 public void run() {  
				 String stime = new Date().toString();
				 System.out.println("middle time: "+ stime);
//				 continueSession();
				 try{
					 service.getSessionData( new AsyncCallback<Void>() {
							@Override
							public void onSuccess(Void result) {
							}
							@Override
							public void onFailure(Throwable caught) {
								String time = new Date().toString();
								MessageBox.alert("로그인", "세션이 종료되었습니다. \n 종료시간:"+ time, btnListener);
								cancel();  
//								box.close();	
							}
						});
				 }catch(Throwable e){
					
				 }
				 bar.updateProgress(i / 100, (int) i + "% Complete");  
				 i += 1;  
				 if (i > 100) {  
					 cancel();  
					 box.close();  
				 }  
			 }
   	  };  
   	  t.scheduleRepeating(60000*35); //30분 1초 
	}
	public void onSubmit() {
		service.getSessionData( new AsyncCallback<Void>() {
			@Override
			public void onFailure(Throwable caught) {
				// 버튼 리스트를 설정
				MessageBox.alert("로그인", "세션이 종료되었습니다. \n 다시 로그인 해주세요", btnListener);
			}
			@Override
			public void onSuccess(Void result) {
				// TODO Auto-generated method stub
//				roop();
			}
		});
	}
	/**
	 * ShowPage이벤트를 가지고 있는 Controller를 통해 ContentView를 보여준다. 여기서 중요한 것은 이벤트와 함께
	 * Entry 객체를 전달했다는 것이다. 이 객체는 화면에 보여줘야할 우리가 클릭한 객체로 이 객체를 전달하면 ContentView에서
	 * 이 객체를 이벤트를 통해 전달 받고 화면에 보여주게 된다.
	 * 
	 * @param entry
	 */
	public static void showPage(Entry entry) {
		AppEvent appEvent = new AppEvent(AppEvents.ShowPage, entry); // 이벤트에 객체전달
		appEvent.setHistoryEvent(true); // event를 history에 남기는가
		appEvent.setToken(entry.getId());
		Dispatcher.forwardEvent(appEvent);  // ShopPage이벤트가 등록되어 있는 ContentController가 ContentView를 보여주게된다.
	}
	public static void setPageData(Entry entry) {
		AppEvent appEvent = new AppEvent(AppEvents.SetPageData, entry); // 이벤트에 객체전달
		appEvent.setHistoryEvent(true); // event를 history에 남기는가
		appEvent.setToken(entry.getId());
		Dispatcher.forwardEvent(appEvent);  // ShopPage이벤트가 등록되어 있는 ContentController가 ContentView를 보여주게된다.
	}
}
